<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //IIFE 立即调用函数表达式 是一种特殊的JS写法。  一旦被定义，立马被调用
        //函数体先用（）包裹变成“函数表达式”，再用（）执行
        //函数转成函数比一定要圆括号也可以是+或者-或者~或者！

        (   //外边一层括号。表示将函数变为表达式  
            function(){
                1//表示任意语句
            }
        )();//后边一对括号，表示执行表达式，运行函数

        //IIFE的作用1：为变量赋值
        //当给变量赋值需要一些较为复杂的计算时（如if语句），使用IEFF显得语法更紧凑
        var age=19;
        var sex="男";
        var title=(function(){//IIFE
            if(age<18){
                return '小朋友'
            }else{
                if(sex=='男'){
                    return '先生';
                }else{
                    return '女士';
                }
            }
        })();
        //不过上述情况可以使用三元运算符进行运算
        var title3=(age<18?'小朋友':(sex=='男'?'先生':'女士'))

        console.log(title)
        console.log(title3)


        //IIFE的作用2
        var arr2=[]
        for(var i=0;i<5;i++){
            arr2.push(function(){
                alert(i);
            })
        }
        arr2[2]()//我们想得到弹出2的函数，但我们却得到了弹出5的函数
        //产生以上结果的原因是i时全局变量，所有函数都共享内存中同一个变量i
        //IFEE的作用2：在一些场合（例如for循环中），将全局变量变为局部变量，语法变得紧凑
        var arr=[];
        for(var i=0;i<5;i++){
            (function(i){
                arr.push(function(){
                    alert(i)
                });
            })(i);//这个i相当于内层function的闭包环境，且为局部变量

        }
        arr[2]();//2


    </script>
</body>
</html>